repofile: Avoid segfault if querying child in non-directory
authorColin Walters <walters@verbum.org>
Mon, 21 Jul 2014 02:32:39 +0000 (22:32 -0400)
committerColin Walters <walters@verbum.org>
Mon, 21 Jul 2014 11:58:07 +0000 (07:58 -0400)
The user might "ostree ls /usr/bin/bash/blah", which previously would
segfault.

A somewhat related future enhancement here would be for "ostree ls" to
follow symbolic links.

Reported-by: Dusty Mabe <dustymabe@gmail.com>
https://bugzilla.gnome.org/show_bug.cgi?id=733476

src/libostree/ostree-repo-file.c
tests/test-basic.sh

index 454b523ba56143e14dcf1ff977daeb66447dbb03..f3215c622a783ba00bfeaf1af211e84ef98ff1b3 100644 (file)
@@ -223,6 +223,13 @@ do_resolve_nonroot (OstreeRepoFile     *self,
   if (!ostree_repo_file_ensure_resolved (self->parent, error))
     goto out;
 
+  if (!self->parent->tree_contents)
+    {
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_DIRECTORY,
+                   "Not a directory");
+      goto out;
+    }
+
   i = ostree_repo_file_tree_find_child (self->parent, self->name, &is_dir, &container);
 
   if (i < 0)
index 19e98b1ebc9dc591aedfca8611e3b082929dbf8e..e078385586a0aaffad530c3f14ebd1dbfdfd9301 100755 (executable)
@@ -267,6 +267,13 @@ cd ${test_tmpdir}
 $OSTREE ls test2
 echo "ok ls with no argument"
 
+cd ${test_tmpdir}
+if $OSTREE ls test2 /baz/cow/notadir 2>errmsg; then
+    assert_not_reached
+fi
+assert_file_has_content errmsg "Not a directory"
+echo "ok ls of not a directory"
+
 cd ${test_tmpdir}
 $OSTREE show test2
 echo "ok show with non-checksum"